package rpc_client

import (
	"git.myscrm.cn/golang/common/proto/common"
	sts "google.golang.org/grpc/status"
)

type status struct {
	*sts.Status
}

// GrpcError
// 云采购定义的grpc错误结构体
type GrpcError struct {
	// 业务状态码
	code int
	// 错误信息
	message string
}

func (e *GrpcError) GetMessage() string {
	return e.message
}

func (e *GrpcError) GetCode() int {
	return e.code
}

// GetGrpcError
// 获取grpc错误信息，包含业务状态码、系统状态码、错误信息
// 如获取ykerrcode.TogRPCError(20019998, "分页size必须大于等于1小于等于1")
func GetGrpcError(err error) *GrpcError {
	if err == nil {
		return nil
	}

	st := fromError(err)
	commonErr := st.commonError()
	grpcError := &GrpcError{}
	if commonErr != nil {
		grpcError.code = int(commonErr.Code)
		grpcError.message = commonErr.Message
	} else {
		grpcError.code = -1
		grpcError.message = err.Error()
	}
	return grpcError
}

func fromError(err error) *status {
	s, _ := sts.FromError(err)
	return &status{s}
}

func (s *status) commonError() *common.Error {
	details := s.Details()
	for _, detail := range details {
		if v, ok := detail.(*common.Error); ok {
			return v
		}
	}
	return nil
}
